package day0415;


import java.util.Arrays;

public class LeetCode74 {
    /**
     * 74. 搜索二维矩阵
     * 已解答
     * 中等
     * <p>
     * 给你一个满足下述两条属性的 m x n 整数矩阵：
     * <p>
     * 每行中的整数从左到右按非严格递增顺序排列。
     * 每行的第一个整数大于前一行的最后一个整数。
     * 给你一个整数 target ，如果 target 在矩阵中，返回 true ；否则，返回 false 。
     * <p>
     * <p>
     * 示例 1：
     * <p>
     * 输入：matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
     * 输出：true
     */
    public static void main(String[] args) {

    }

    public boolean searchMatrix(int[][] matrix, int target) {
        Integer line = lineBinarySearch(matrix, target);
        if (line == null)
            return true;
        return binarySearch(matrix[line], target);

    }

    private static Integer lineBinarySearch(int[][] matrix, int target) {
        // 对列进行二分查找
        int left = 0;
        int right = matrix.length;
        while (left+1 < right) {
            int mid = left + (right - left) / 2;
            if (target == matrix[mid][0]) {
                return null;
            } else if (target < matrix[mid][0]) {
                right = mid;
            } else {
                left = mid;
            }
        }
        return left;
    }

    private static boolean binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (target == arr[mid]) {
                return true;
            } else if (target < arr[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }

}
